//
// Created by hjie on 23-8-13.
//
#pragma once
#include <cstring>
#include <cstdlib>
#include <cstdint>
#include <string>
#include <vector>


struct Extension
{
    uint32_t m_data;
};

class RtpHeaderFrame
{
public:
    uint8_t m_version;  // 2bit : 版本
    uint8_t m_padding;  // 1bit : 是否填充
    uint8_t m_extension;// 1bit : 时候包含扩展信息
    uint8_t m_contributing_sources; // 4bit : CSRC计数器，占4位，指示CSRC 标识符的个数
    uint8_t m_marker;   // 1bit:标记，占1位，不同的有效载荷有不同的含义，对于视频，标记一帧的结束；对于音频，标记会话的开始。
    uint8_t m_payload_type; // 7bit:RTP包数据类型
    uint16_t m_sequence_number; // 16bit:用于标识数据包的序列号。该字段用于确保数据包的顺序和完整性。(每发送一个报文，序列号增1)
    uint32_t m_timestamp;   // 32bit:占32位，反映了该RTP报文的第一个八位组的采样时刻。接收者使用时戳来计算延迟和延迟抖动，并进行同步控制。使用的是采样时间
    uint32_t m_ssrc;        // 32bit
    std::vector<uint32_t> m_csrc_vec;
    Extension m_extension_data;// 32bit扩展信息占比
};

class RtpDataFrame
{
public:
    uint8_t * m_rtp_data;
    uint32_t  m_data_length;
};

class RtpFrame
{
public:
    RtpHeaderFrame m_header;
    RtpDataFrame   m_data;
};

void PrintRtpHeader(RtpHeaderFrame & header);


